home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / u / utility / packer / crunch / crunch.src < prev    next >
Encoding:
Internet Message Format  |  1996-11-17  |  16.1 KB

  1. From: koreth%panarthea.ebay@sun.com (Steven Grimm)
  2. Newsgroups: comp.sources.atari.st
  3. Subject: v02i063: crunch -- Executable file compressor
  4. Keywords: 68000
  5. Approved: koreth%panarthea.ebay@sun.com
  6.  
  7. Submitted-by: usqb015@liverpool.ac.uk (Mark Powell)
  8. Posting-number: Volume 2, Issue 63
  9. Archive-name: crunch
  10.  
  11. [Binary and docs are in comp.binaries.atari.st. -sg]
  12.  
  13. * Program file Cruncher
  14. * Copyright 1989 By M.S.Powell (usqb015@uk.ac.liv)
  15. * Permission granted to examine and modify this source for; personal use,
  16. * no profit and as long as this header is left intact.
  17. * Written on Devpac v1.22 by Hisoft
  18.  
  19. * Examine command line
  20.  
  21.     move.l    4(sp),a5
  22.  
  23.     lea    129(a5),a5
  24.     cmp.b    #'-',(a5)
  25.     bne.s    nxtfield
  26.     addq.l    #1,a5
  27. chkqual    move.b    (a5)+,d0
  28.     cmp.b    #$d,d0
  29.     beq    invalid
  30.     cmp.b    #' ',d0
  31.     beq.s    nxtfield
  32.     cmp.b    #'D',d0
  33.     bne.s    notd
  34.     move    #1,delete
  35. notd    cmp.b    #'H',d0
  36.     bne.s    noth
  37.     move    #1,hold
  38. noth    cmp.b    #'U',d0
  39.     bne.s    notu
  40.     move    #1,uncrunch
  41. notu    cmp.b    #'I',d0
  42.     bne.s    chkqual
  43.     move    #1,ignore
  44.     bra.s    chkqual
  45.  
  46. nxtfield
  47.     cmp.b    #' ',(a5)
  48.     bne.s    getname1
  49.     addq.l    #1,a5
  50.     bra.s    nxtfield
  51. getname1
  52.     cmp.b    #$d,(a5)
  53.     beq    invalid
  54.     move.l    a5,sourcenamepnt
  55. getname1loop
  56.     move.b    (a5)+,d0
  57.     cmp.b    #$d,d0
  58.     beq.s    fndend1
  59.     cmp.b    #' ',d0
  60.     bne.s    getname1loop
  61. fndend1    subq.l    #1,a5
  62.     move.l    a5,sourcenameend
  63.     bra.s    intro
  64.  
  65. invalid    clr    cmndlnokay
  66.  
  67. * Intro procedure
  68.  
  69. intro    lea    mainmess(pc),a0
  70.     bsr    print
  71.  
  72.     tst    cmndlnokay
  73.     bne.s    clokay
  74.  
  75.     lea    instructions(pc),a0
  76.     bsr    print
  77.     bra    finished
  78.  
  79. clokay    pea    dta(pc)        set dta buffer
  80.     move    #$1a,-(sp)
  81.     trap    #1
  82.     addq.l    #6,sp
  83.  
  84.     clr    -(sp)            Search for source file
  85.     move.l    sourcenamepnt(pc),-(sp)
  86.     move    #$4e,-(sp)
  87.     trap    #1
  88.     addq.l    #8,sp
  89.     move    d0,error
  90.     beq    nextfile
  91.  
  92.     lea    nomatch(pc),a0
  93.     bsr    print
  94.     bra    finished
  95.  
  96. * Main loop
  97.  
  98. nextfile
  99.     lea    dta+30(pc),a0
  100.     move.l    sourcenameend(pc),a1
  101.     move.l    sourcenamepnt(pc),a2
  102. look_for_name_start
  103.     move.b    -(a1),d0
  104.     cmp.b    #'\',d0
  105.     beq.s    addname
  106.     cmp.b    #':',d0
  107.     beq.s    addname
  108.     cmp.l    a2,a1
  109.     bge.s    look_for_name_start
  110.  
  111. addname    moveq    #0,d1
  112.     addq.l    #1,a1
  113. anamlp    move.b    (a0)+,d0
  114.     move.b    d0,(a1)+
  115.     beq.s    done_name
  116.     cmp.b    #'.',d0
  117.     bne.s    anamlp
  118.     moveq    #1,d1
  119.     move.l    a1,sourcenameext
  120.     bra.s    anamlp
  121. done_name
  122.     tst    d1
  123.     bne.s    do_it
  124.     move.l    a1,sourcenameext
  125. do_it    bra    do_your_stuff
  126. return
  127.     tst    error
  128.     beq.s    noerror
  129.  
  130.     tst    ignore
  131.     beq.s    finished
  132.  
  133. noerror    move    #$4f,-(sp)
  134.     trap    #1
  135.     addq.l    #2,sp
  136.     tst    d0
  137.     beq.s    nextfile
  138.  
  139. finished
  140.     tst    hold
  141.     beq.s    nohold
  142.  
  143.     lea    pressany(pc),a0
  144.     bsr    print
  145.     bsr.s    anykey
  146.  
  147. nohold    move    error(pc),-(sp)        Return error code to calling
  148.     move    #$4c,-(sp)        program
  149.     trap    #1
  150.  
  151. anykey    pea    $20002
  152.     trap    #13
  153.     addq.l    #4,sp
  154.     rts
  155.  
  156. prchar    move    d0,-(sp)
  157.     pea    $30002
  158.     trap    #13
  159.     addq.l    #6,sp
  160.     rts
  161.  
  162.  
  163. * Main loop body
  164.  
  165. do_your_stuff
  166.     move.l    sp,stack
  167.  
  168.     lea    reading(pc),a0
  169.     bsr    print
  170.     bsr    printfilename
  171.  
  172.     move.l    sp,a6
  173.     sub.l    #4096,a6    a6=top of free memory
  174.     move.l    dta+26(pc),d6    d6=file length
  175.     cmp.l    #28,d6
  176.     blt.s    not_a_program
  177.  
  178.     lea    buffer(pc),a0
  179.     add.l    d6,a0
  180.     cmp.l    a6,a0
  181.     bgt    outofmemory
  182.  
  183. * Read in file
  184.  
  185.     lea    buffer(pc),a3
  186.     clr    -(sp)
  187.     move.l    sourcenamepnt(pc),-(sp)
  188.     move    #$3d,-(sp)
  189.     trap    #1
  190.     addq.l    #8,sp
  191.     tst.l    d0
  192.     bmi    fileerror
  193.  
  194.     move    d0,d7
  195.     pea    (a3)        Read first 2 bytes, to check if it is
  196.     pea    2.w        a valid GEMDOS program
  197.     move    d0,-(sp)
  198.     move    #$3f,-(sp)
  199.     trap    #1
  200.     lea    12(sp),sp
  201.     tst.l    d0
  202.     bmi    fileerror
  203.     cmp    #$601a,(a3)
  204.     beq.s    a_prog
  205.  
  206. not_a_program
  207.     lea    notprog(pc),a0
  208.     bsr    print
  209.     bra    exit
  210.  
  211. a_prog    pea    2(a3)
  212.     move.l    d6,-(sp)
  213.     move    d7,-(sp)
  214.     move    #$3f,-(sp)
  215.     trap    #1
  216.     lea    12(sp),sp
  217.     tst.l    d0
  218.     bmi    fileerror
  219.  
  220.     move    d7,-(sp)
  221.     move    #$3e,-(sp)
  222.     trap    #1
  223.     addq.l    #4,sp
  224.  
  225. * Check if file is already crunched
  226.  
  227.     lea    buffer+$1c(pc),a0
  228.     lea    header+$1c(pc),a1
  229.     move    #lengthoftable-header-$1c-1,d0
  230. chklp    cmpm.b    (a0)+,(a1)+
  231.     dbne    d0,chklp
  232.     bne    crunchfile
  233.  
  234. * If file is already crunched, then uncrunch it
  235.  
  236.     tst    uncrunch
  237.     bne.s    uncrunchit
  238.  
  239.     lea    crunched(pc),a0
  240.     bsr    print
  241.     bra    exit
  242.  
  243. uncrunchit
  244.     lea    uncrunching(pc),a0
  245.     bsr    print
  246.  
  247.     lea    buffer+(lengthoftable-header)(pc),a0
  248.     lea    buffer-lengthoftable(a0),a3
  249.     move.l    (a0)+,a4
  250.     add.l    a3,a4
  251.     move.l    (a0)+,a5
  252.     add.l    a4,a5
  253.  
  254.     move.l    (a0)+,d0
  255.     move.l    (a3),d1
  256.     and.l    #$ffffff,d1
  257.     lea    0(a4,d1.l),a0
  258.     move.l    a0,a2
  259.     lea    0(a5,d0.l),a1
  260.     cmp.l    a6,a1
  261.     bgt    outofmemory
  262.     move.l    a1,a6
  263. moveup1    move.b    -(a5),-(a1)
  264.     cmp.l    a5,a0
  265.     bne.s    moveup1
  266.     move.l    a6,a5
  267.     move.l    a1,a6
  268.  
  269. uncrunchloop1
  270.     move.l    (a3)+,d1
  271.     move.l    d1,d2
  272.     rol.l    #8,d2
  273.     and.l    #$ffffff,d1
  274.     moveq    #0,d3
  275.     move    (a3)+,d3
  276.     bne.s    not103
  277.     move.l    #65536,d3
  278. not103    add.l    d0,d1
  279.     sub.l    d3,d0
  280.     lea    0(a4,d1.l),a0
  281.     cmp.l    a6,a0
  282.     beq.s    nomove12
  283. movebitdown1
  284.     move.b    (a6)+,(a2)+
  285.     cmp.l    a6,a0
  286.     bne.s    movebitdown1
  287. nomove12
  288.     subq    #1,d3
  289. makeblock1
  290.     move.b    d2,(a2)+
  291.     dbra    d3,makeblock1
  292.     tst.l    d0
  293.     bne.s    uncrunchloop1
  294.  
  295.     move.l    a5,a3
  296.     sub.l    a4,a3
  297.  
  298.     tst    delete
  299.     beq    writefile
  300.     move.l    sourcenameext(pc),a0
  301.     move.b    #'.',-1(a0)
  302.     move.b    #'U',(a0)+
  303.     move.b    #'C',(a0)+
  304.     move.b    #'R',(a0)+
  305.     bra    writefile
  306.  
  307. * Crunch a file
  308.  
  309. crunchfile
  310.     tst    uncrunch
  311.     beq.s    okaycf
  312.  
  313.     lea    notcrunched(pc),a0
  314.     bsr    print
  315.     bra    exit
  316.  
  317. okaycf    lea    crunching(pc),a0
  318.     bsr    print
  319.  
  320.     move.l    a6,a5
  321.     sub.l    d6,a5
  322.     move.l    a6,a4
  323.     lea    0(a3,d6.l),a3
  324. moveprogup
  325.     move.b    -(a3),-(a4)
  326.     cmp.l    a4,a5
  327.     bne.s    moveprogup
  328.  
  329.     lea    buffer(pc),a4
  330.     lea    -6(a6),a2
  331.     move.l    2(a4),d7
  332.     add.l    6(a4),d7
  333.     add.l    $a(a4),d7    d7=total original length
  334.  
  335.     move.l    a5,a0
  336. p1lp    moveq    #0,d0
  337.     move.b    (a0),d0
  338.     cmp.b    1(a0),d0
  339.     bne.s    notsam
  340.     cmp.b    2(a0),d0
  341.     bne.s    notsam
  342.     cmp.b    3(a0),d0
  343.     bne.s    notsam
  344.     cmp.b    4(a0),d0
  345.     bne.s    notsam
  346.     cmp.b    5(a0),d0
  347.     bne.s    notsam
  348.     cmp.b    6(a0),d0
  349.     bne.s    notsam
  350.  
  351.     lea    7(a0),a1
  352. fndend    cmp.l    a6,a1
  353.     bgt.s    endprog
  354.     cmp.b    (a1)+,d0
  355.     beq.s    fndend
  356. endprog    move.l    a0,d1
  357.     sub.l    a5,d1
  358.     ror.l    #8,d0
  359.     or.l    d0,d1
  360.     subq.l    #1,a1
  361.     move.l    a1,d2
  362.     sub.l    a0,d2
  363. nextbit    cmp.l    #65536,d2
  364.     ble.s    lastbit
  365.     move.l    d1,(a4)+
  366.     add.l    #65536,d1
  367.     clr    (a4)+
  368.     sub.l    #65536,d2
  369.     bra.s    nextbit
  370. lastbit    move.l    d1,(a4)+
  371.     move    d2,(a4)+
  372.     cmp.l    a5,a4
  373.     bge    outofmemory
  374.     lea    -1(a1),a0
  375.  
  376. notsam    addq.l    #1,a0
  377.     cmp.l    a2,a0
  378.     blt.s    p1lp
  379.  
  380.     lea    buffer+4(pc),a3
  381.     cmp.l    a3,a4        Is table empty?
  382.     blt    hopeless
  383.     move.l    a4,-(sp)
  384.     moveq    #0,d1
  385.     move    -(a4),d1
  386.     bne.s    not0
  387.     move.l    #65536,d1
  388. not0    move.l    -4(a4),d2
  389.     and.l    #$ffffff,d2
  390.     add.l    d1,d2
  391.     lea    0(a5,d2.l),a2
  392.     cmp.l    a4,a3
  393.     beq.s    lastblock
  394. crunchloop
  395.     move.l    -(a4),d2
  396.     and.l    #$ffffff,d2
  397.     lea    0(a5,d2.l),a1
  398.     moveq    #0,d1
  399.     move    -(a4),d1
  400.     bne.s    not01
  401.     move.l    #65536,d1
  402. not01    move.l    -4(a4),d2
  403.     and.l    #$ffffff,d2
  404.     add.l    d1,d2
  405.     lea    0(a5,d2.l),a0
  406.     cmp.l    a1,a0
  407.     beq.s    nomove
  408. removeblock
  409.     move.b    -(a1),-(a2)
  410.     cmp.l    a1,a0
  411.     bne.s    removeblock
  412. nomove    cmp.l    a4,a3
  413.     bne.s    crunchloop
  414.  
  415. lastblock
  416.     move.l    -(a4),d1
  417.     and.l    #$ffffff,d1
  418.     lea    0(a5,d1.l),a1
  419.     cmp.l    a5,a1
  420.     beq.s    nomove1
  421. removelastblock
  422.     move.b    -(a1),-(a2)
  423.     cmp.l    a5,a1
  424.     bne.s    removelastblock
  425. nomove1    move.l    a2,a5
  426.  
  427.     move.l    (sp)+,a4
  428.  
  429. * Add uncrunch program
  430.  
  431. done    move.l    a4,a3
  432.     move.l    a5,a2    attach crunched prog to end of table
  433. moveprog
  434.     move.b    (a2)+,(a3)+
  435.     cmp.l    a2,a6
  436.     bne.s    moveprog
  437.  
  438.     move.l    a3,d0
  439.     sub.l    a4,d0
  440.     move.l    d0,lengthofprog
  441.  
  442.     move.l    a4,d0
  443.     lea    buffer(pc),a2
  444.     sub.l    a2,d0
  445.     move.l    d0,lengthoftable
  446.  
  447.     moveq    #0,d1
  448. getlengthloop
  449.     addq.l    #4,a2
  450.     moveq    #0,d0
  451.     move    (a2)+,d0
  452.     bne.s    not02
  453.     move.l    #65536,d0
  454. not02    add.l    d0,d1
  455.     cmp.l    a2,a4
  456.     bne.s    getlengthloop
  457.     move.l    d1,totallength
  458.  
  459.     lea    header(pc),a4
  460.     sub.l    a4,a3
  461.     move.l    a3,d0
  462.     add.l    #1023,d0
  463.     and.l    #$fffc00,d0
  464.     add.l    #1023,d6
  465.     and.l    #$fffc00,d6
  466.     cmp.l    d0,d6
  467.     ble    hopeless
  468.     lea    -$1c(a3),a0
  469.     move.l    a0,2(a4)
  470.     sub.l    a0,d7
  471.     move.l    d7,$a(a4)
  472.  
  473.     tst    delete
  474.     beq.s    writefile
  475.     move.l    sourcenameext(pc),a0
  476.     move.b    #'.',-1(a0)
  477.     move.b    #'C',(a0)+
  478.     move.b    #'R',(a0)+
  479.     move.b    #'N',(a0)+
  480.  
  481. writefile
  482.     lea    writing(pc),a0
  483.     bsr    print
  484.     bsr    printfilename
  485.  
  486.     clr    -(sp)
  487.     move.l    sourcenamepnt(pc),-(sp)
  488.     move    #$3c,-(sp)
  489.     trap    #1
  490.     addq.l    #8,sp
  491.     tst.l    d0
  492.     bmi    fileerror
  493.  
  494.     move    d0,-(sp)
  495.     pea    (a4)
  496.     pea    (a3)
  497.     move    d0,-(sp)
  498.     move    #$40,-(sp)
  499.     trap    #1
  500.     lea    12(sp),sp
  501.     tst.l    d0
  502.     bmi    fileerror
  503.  
  504.     move    #$3e,-(sp)
  505.     trap    #1
  506.     addq.l    #4,sp
  507.     tst.l    d0
  508.     bmi    fileerror
  509.  
  510. exit    move.l    stack(pc),sp
  511.     bra    return
  512.  
  513.  
  514.  
  515. * Error routines
  516.  
  517. outofmemory
  518.     lea    outmem(pc),a0
  519.     bsr.s    print
  520.     move    #-39,error
  521.     bra.s    exit
  522.  
  523. fileerror
  524.     move    d0,error
  525.     lea    generror(pc),a0
  526.     bsr.s    print
  527.     bra.s    exit
  528.  
  529. hopeless
  530.     lea    nohope(pc),a0
  531.     bsr.s    print
  532.     bra.s    exit
  533.  
  534. print    pea    (a0)
  535.     move    #9,-(sp)
  536.     trap    #1
  537.     addq.l    #6,sp
  538.     rts
  539.  
  540. printfilename
  541.     move.l    sourcenamepnt(pc),a5    Print file name
  542. prnamlp    move.b    (a5)+,d0
  543.     beq.s    donenameprint
  544.     bsr    prchar
  545.     bra.s    prnamlp
  546. donenameprint
  547.     moveq    #13,d0
  548.     bsr    prchar
  549.     moveq    #10,d0
  550.     bra    prchar
  551.  
  552. find_target_file_ext
  553.     lea    dta+30(pc),a0
  554. lookext    move.b    (a0)+,d0
  555.     beq.s    fndext
  556.     cmp.b    #'.',d0
  557.     bne.s    lookext
  558.  
  559. fndext    move.b    #'.',-1(a0)
  560.     rts
  561.  
  562.  
  563. * Various data
  564.  
  565. mainmess
  566.     dc.b    27,'vProgram file cruncher V3.2',13,10,13,10
  567.     dc.b    'Copyright 4/9/1988 By M.S.Powell',13,10,0
  568. instructions
  569.     dc.b    13,10,'Usage:',13,10,13,10
  570.     dc.b    'crunch [h][d][u] <pathname> ',13,10,13,10
  571.     dc.b    'h hold screen before exiting',13,10
  572.     dc.b    'd disable deletion of original file',13,10
  573.     dc.b    'u uncrunch files',13,10,0
  574.  
  575. nomatch    dc.b    13,10,'No files match pathname',13,10,0
  576. reading    dc.b    13,10,'Reading ',0
  577. writing    dc.b    'Writing ',0
  578.  
  579. crunched
  580.     dc.b    'File already crunched',13,10,0
  581. notprog
  582.     dc.b    'Not a GEMDOS program file',13,10,0
  583. notcrunched
  584.     dc.b    'File not crunched',13,10,0
  585. uncrunching
  586.     dc.b    'Uncrunching...',13,10,0
  587. crunching
  588.     dc.b    'Crunching...',13,10,0
  589.  
  590. outmem    dc.b    'Out of memory',13,10,0
  591. nohope    dc.b    'File uncrunchable',13,10,0
  592. generror
  593.     dc.b    'A file error has occured',13,10,0
  594. pressany
  595.     dc.b    13,10,'Press any key ',0
  596.     even
  597.  
  598. stack    dc.l    0
  599. error    dc.w    0
  600. cmndlnokay
  601.     dc.w    1
  602.  
  603. delete    dc.w    0
  604. hold    dc.w    0
  605. uncrunch
  606.     dc.w    0
  607. ignore    dc.w    0
  608.  
  609. sourcenamepnt
  610.     dc.l    0
  611. sourcenameend
  612.     dc.l    0
  613. sourcenameext
  614.     dc.l    0
  615.  
  616.     even
  617.  
  618. dta    ds.b    44
  619.  
  620.  
  621. * GEMDOS header
  622.  
  623. header    dc.w    $601a
  624.     dc.l    0,0,0,0,0,0
  625.     dc.w    $ffff
  626.  
  627. * Uncrunch routine
  628.  
  629. uncrunchprog
  630.     clr.l    -(sp)
  631.     move    #32,-(sp)
  632.     trap    #1
  633.     addq.l    #6,sp
  634.     move.l    d0,-(sp)
  635.  
  636.     move    $8240.w,-(sp)
  637.  
  638.     lea    start(pc),a3
  639.     move.l    lengthoftable(pc),a4
  640.     add.l    a3,a4
  641.     move.l    lengthofprog(pc),a5
  642.     add.l    a4,a5
  643.  
  644.     move.l    totallength(pc),d0
  645.     move.l    (a3),d1
  646.     and.l    #$ffffff,d1
  647.     lea    0(a4,d1.l),a0
  648.     move.l    a0,a2
  649.     lea    0(a5,d0.l),a1
  650.     move.l    a1,a6
  651. moveup    move.b    -(a5),-(a1)
  652.     cmp.l    a5,a0
  653.     bne.s    moveup
  654.     move.l    a6,a5
  655.     move.l    a1,a6
  656.  
  657. uncrunchloop
  658.     move    d5,$8240.w
  659.     add    #$89,d5
  660.     and    #$777,d5
  661.     or    #$333,d5
  662.     move.l    (a3)+,d1
  663.     move.l    d1,d2
  664.     rol.l    #8,d2
  665.     and.l    #$ffffff,d1
  666.     moveq    #0,d3
  667.     move    (a3)+,d3
  668.     bne.s    not03
  669.     move.l    #65536,d3
  670. not03    add.l    d0,d1
  671.     sub.l    d3,d0
  672.     lea    0(a4,d1.l),a0
  673.     cmp.l    a6,a0
  674.     beq.s    nomove2
  675. movebitdown
  676.     move.b    (a6)+,(a2)+
  677.     cmp.l    a6,a0
  678.     bne.s    movebitdown
  679. nomove2    subq    #1,d3
  680. makeblock
  681.     move.b    d2,(a2)+
  682.     dbra    d3,makeblock
  683.     tst.l    d0
  684.     bne.s    uncrunchloop
  685.  
  686. * move relocate program to end of text
  687.  
  688. doneuncrunch
  689.     move.l    a5,d0
  690.     addq.l    #1,d0
  691.     and    #$fffe,d0
  692.     move.l    d0,a1
  693.     move.l    d0,a2
  694.     lea    relocate(pc),a0
  695.     move    #start-relocate-1,d0
  696. movereloc
  697.     move.b    (a0)+,(a1)+
  698.     dbra    d0,movereloc
  699.     jmp    (a2)
  700.  
  701. relocate
  702.     move    (sp)+,$8240.w
  703.     move.l    8(sp),a0    a0=start of base page
  704.     lea    $100(a0),a1    a1=start of text area
  705.     move.l    a1,a2
  706.     move.l    a0,(a0)+    base address of TPA
  707.     move.l    $436.w,(a0)+    end of TPA+1
  708.     move.l    a1,(a0)+    base address of text
  709.     move.l    2(a4),(a0)+    length of text
  710.     add.l    2(a4),a1
  711.     move.l    a1,(a0)+    base address of data
  712.     move.l    6(a4),(a0)+    length of data
  713.     add.l    6(a4),a1
  714.     move.l    a1,(a0)+    base address of bss
  715.     move.l    $a(a4),(a0)+    length of bss
  716.     move.l    a1,-(sp)
  717.     move.l    $a(a4),-(sp)
  718.     add.l    $e(a4),a1    a1=address of relocation data
  719.     tst    $1a(a4)
  720.     bpl.s    relocpres
  721.     sub.l    a1,a1        a1=0 if no reloc. data
  722. relocpres
  723.     lea    $1c(a4),a4
  724.     move.l    a2,a3        a3=start of text
  725.     clr.b    (a5)
  726. movetextdown
  727.     move.l    (a4)+,(a2)+
  728.     cmp.l    a5,a4
  729.     blt.s    movetextdown
  730.     moveq    #0,d7
  731.     cmp.l    d7,a1
  732.     beq.s    execute
  733.  
  734. * Relocate text
  735.  
  736.     move.l    a3,a6        a6=start of text
  737.  
  738.     move.l    a6,d0
  739.     move.l    (a1)+,d1
  740.     beq.s    execute
  741.     add.l    d1,a6
  742.     add.l    d0,(a6)
  743.     moveq    #1,d2
  744.     move.l    #$fe,d3
  745.     moveq    #0,d1
  746. reloclp    move.b    (a1)+,d1
  747.     beq.s    execute
  748.     cmp.b    d2,d1
  749.     beq.s    disp
  750.     add.l    d1,a6
  751.     add.l    d0,(a6)
  752.     bra.s    reloclp
  753. disp    add.l    d3,a6
  754.     bra.s    reloclp
  755.  
  756. execute    move.l    (sp)+,d5    d5=length of bss
  757.     move.l    (sp)+,a4    a4=start of bss
  758.     move    #32,-(sp)
  759.     trap    #1
  760.     addq.l    #6,sp
  761.  
  762.     lea    start_bss_clearer(pc),a0
  763.     move.l    d5,d6
  764.     add.l    a4,d6
  765.     addq.l    #1,d6
  766.     and    #$fffe,d6
  767.     move.l    d6,a5
  768.     move.l    a5,a6
  769.     move.l    (a0)+,(a5)+
  770.     move.l    (a0)+,(a5)+
  771.     jmp    (a6)
  772.  
  773. start_bss_clearer
  774.     move.b    d7,(a4)+
  775.     cmp.l    a6,a4
  776.     blt.s    start_bss_clearer
  777. runit    jmp    (a3)
  778. end
  779.  
  780. lengthoftable    dc.l    0
  781. lengthofprog    dc.l    0
  782. totallength    dc.l    0
  783. start
  784. buffer
  785.  
  786.